package fr.istic.linkedcv.server.servicesImpl;

import java.util.ArrayList;
import java.util.List;

import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Query;
import javax.servlet.http.HttpSession;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import fr.istic.linkedcv.client.GroupesCli;
import fr.istic.linkedcv.client.PersonneCli;
import fr.istic.linkedcv.client.services.GroupeService;
import fr.istic.linkedcv.server.GroupesImpl;
import fr.istic.linkedcv.server.PMF;
import fr.istic.linkedcv.server.PersonneImpl;

public class GroupeServiceImpl extends RemoteServiceServlet implements GroupeService {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6375301725095581L;

	@Override
	public List<PersonneCli> getListPersonnes(String nomGroupe) {
		List<PersonneCli> res = new ArrayList<PersonneCli>();
		PersistenceManagerFactory pmf = PMF.get();
		PersistenceManager pm = pmf.getPersistenceManager();
		try{
			
			Key key = KeyFactory.createKey(GroupesImpl.class.getSimpleName(),nomGroupe);
			GroupesImpl groupesImpl = pm.getObjectById(GroupesImpl.class, key);
			List<Key> personnesSet = groupesImpl.getPersonnesSet();
			for(Key personneKey : personnesSet){
				res.add(getPersonneCli(personneKey,pm));
			}
		}finally{
			pm.close();
		}
		return res;
	}
	
	private PersonneCli getPersonneCli(Key personnesKey,PersistenceManager pm){
		PersonneImpl personneImpl = pm.getObjectById(PersonneImpl.class, personnesKey);
		PersonneServiceImpl personneServiceImpl = new PersonneServiceImpl();
		
		
		return personneServiceImpl.createPersonneCli(personneImpl);
	}

	@Override
	public List<GroupesCli> getListeGroupes() {
		PersistenceManagerFactory pmf = PMF.get();
		PersistenceManager pm = pmf.getPersistenceManager();
		List<GroupesCli> res = new ArrayList<GroupesCli>();
		try{
			Query q = pm.newQuery(GroupesImpl.class);
			List<GroupesImpl> listGroupes = (List<GroupesImpl>) q.execute();
			PersonneServiceImpl personneServiceImpl = new PersonneServiceImpl();
			for (GroupesImpl groupe : listGroupes) {
				
				res.add(personneServiceImpl.createGroupeClient(groupe));
			}

		}finally{
			pm.close();
		}
		return res;
	}

	@Override
	public boolean deleteGroupe(String nomGroupe) {
		boolean res = false;
		PersistenceManagerFactory pmf = PMF.get();
		PersistenceManager pm = pmf.getPersistenceManager();
		try{
			
			Key key = KeyFactory.createKey(GroupesImpl.class.getSimpleName(), nomGroupe);
			GroupesImpl groupesImpl = pm.getObjectById(GroupesImpl.class, key);
			List<Key> personnesSet = groupesImpl.getPersonnesSet();
			for(Key personneKey : personnesSet){
				PersonneImpl personneImpl = pm.getObjectById(PersonneImpl.class, personneKey);
				groupesImpl.removePersonne(personneImpl);
			}
			pm.deletePersistent(groupesImpl);
			
			res = true;
		}finally{
			pm.close();
		}
		return res;
	}

	@Override
	public boolean joinGroupe(String nomGroupe) {
		boolean res = false;
		PersistenceManagerFactory pmf = PMF.get();
		PersistenceManager pm = pmf.getPersistenceManager();
		HttpSession session = this.getThreadLocalRequest().getSession();
		try{
			GroupesImpl groupesImpl = pm.getObjectById(GroupesImpl.class, nomGroupe);
			PersonneImpl personneImpl = pm.getObjectById(PersonneImpl.class, (String) session.getAttribute("login"));
			groupesImpl.addPersonne(personneImpl);
			res = true;
		}finally{
			pm.close();
		}
		return res;
	}

	

}
